package main

import (
	"fmt"
)

func main() {
	// var m1 map[int]int // 手动初始化，nil
	// fmt.Println(m1 == nil)
	// m1[101] = 30 // nil 零值 nil map 不可以用
	// 1 字面量定义
	m1 := map[int]int{100: 111} // 初始化了的 map，底层桶数组，B 0
	m1[101] = 30
	m1[102] = 40
	m1[1111111111111] = 1
	m1[100] = 111 // 覆盖100
	fmt.Printf("%T %[1]v\n", m1)
	// 2 make
	m2 := make(map[string]int, 100) // B 0
	m2["a"] = 100
	m2["bcd"] = 30
	m2["a"] = -1
	m2["ABC"] = 200

	fmt.Println(m2["c"]) // key不存在，返回值类型的零值
	m2["score"] = 80
	m2["stuno"] = 101
	fmt.Printf("%T %[1]v\n", m2)
	fmt.Println(len(m2))
	delete(m2, "c") // 不存在，没有异常
	delete(m2, "score")
	fmt.Printf("%T %[1]v\n", m2)

	v, ok := m2["c"]
	if ok {
		fmt.Println("存在", v)
	} else {
		fmt.Println("k不存在，用零值", v)
	}

	// var m3 map[string]any // 不建议这样写
	// var m4 map[any]any    // 不建议这样写

	// var m5 map[string]map[int]string / k是 string v 是 map
	// var m6 map[string][]int // k是 string v 是切片

	for k, v := range m2 {
		fmt.Printf("%T %[1]s => %T %[2]d, %d\n", k, v, m2[k])
	}

	// 需要获得所有 keys，go没有提供什么方便的函数
	keys := make([]string, 0, len(m2))
	for k := range m2 {
		keys = append(keys, k)

	}
	fmt.Println(keys)
	fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~")

	// 获得所有的 values
	values := make([]int, 0, len(m2))
	for _, v := range m2 {
		values = append(values, v)
	}
	fmt.Println(values)
	for i, v := range values {
		fmt.Println(i, v)
	}
	clear(m2)
	fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
	fmt.Printf("%T %[1]v\n", m2)
	fmt.Println(len(m2))

	// slice
	s1 := []int{1, 3, 5}
	clear(s1)
	fmt.Printf("%v, %d, %d\n", s1, len(s1), cap(s1))

}
